/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 22652
 * Date: 2024-05-26
 * Time: 10:35
 */
public class MaxProfit_2 {
    public int maxProfit(int[] prices) {
        // 1. 创建 dp 表
        // 2. 初始化
        // 3. 填表
        // 4. 返回结果
        int INF = 0x3f3f3f3f;
        /*为了取 max 的时候，⼀些不存在的状态「起不到⼲扰」的作⽤，我们统统将它们初始化为 -
        INF （⽤ INT_MIN 在计算过程中会有「溢出」的⻛险，这⾥ INF 折半取
        0x3f3f3f3f ，⾜够⼩即可）*/
        int n = prices.length;
        int[][] f = new int[n][3];
        int[][] g = new int[n][3];
        for (int j = 0; j < 3; j++) {
            f[0][j] = -INF;
            g[0][j] = -INF;
        }
        f[0][0] = -prices[0];
        g[0][0] = 0;
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < 3; j++) {
                f[i][j] = Math.max(f[i - 1][j], g[i - 1][j] - prices[i]);
                g[i][j] = g[i - 1][j];
                if (j >= 1) {
                    g[i][j] = Math.max(g[i][j], f[i - 1][j - 1] + prices[i]);
                    /*在 i - 1 天的时候，交易了 j - 1 次，处于「买⼊」状态，第 i 天把股票卖了，然
                    后就完成了 j ⽐交易。此时的最⼤利润为： f[i - 1][j - 1] + prices[i] 。但
                    是这个状态不⼀定存在，要先判断⼀下*/
                }
            }
        }
        int ret = 0;
        for (int j = 0; j < 3; j++) {
            ret = Math.max(ret, g[n - 1][j]);
        }
        return ret;
    }
}
